package org.springframework.beans.factory.test.annoTest;

import org.springframework.beans.factory.anno.*;
import org.springframework.beans.factory.context.AnnotationApplicationContext;

/**
 * @author:刘仁有
 * @desc:
 * @email:953506233@qq.com
 * @data:2019/11/16
 */

/**
 * 第一天：bd描述，bean工厂，bd注册中心
 * 第二天：实现bean工厂 ，基本功能，默认构造实例化，属性注入，单例池
 * 第三天：属性循环依赖+推断构造器+beanPostProcessor
 * 至此基础ioc已完成，考虑提供注解
 * 第四天：AnnotationApplicationContext 相关内容，这是提供给外部的入口
 * 第五天：
 *          //实例化bean工厂，注册三个bd
 *         this();
 *         //注册config bd
 *         register(annotatedClasses);
 *  第六/七/八天：refresh中的  invokeBeanFactoryPostProcessors
 *  这三天做的事情非常重要，提供了anno包的一些注解
 *  解析appConfig配置类，ComponentScan,Component,循环import
 *  ImportBeanDefinitionRegistry接口，
 *
 *  第九天：属性@Autowired 和@Value
 *  第十天：@Bean , FactoryBean
 *
 *  MapperScan+ImportBeanDefinitionRegistry接口+FactoryBean = 奇迹
 *  这是mybatis运用的一个spring扩展，完成mapper扫描与对mapper接口的动态代理
 *  //测试用例有这个例子1
 */
@Role(1)
@Configuration
@MapperScan("org.springframework.beans.factory.test")
@ComponentScan(value = "org.springframework.beans.factory.test")
@Import({UserService.class})
@Lazy(true)
public class AppConfig {
    //todo   Aop
    public static void main(String[] args) throws Exception {
        AnnotationApplicationContext app = new AnnotationApplicationContext(AppConfig.class);
        OrderService orderService = (OrderService) app.getBean("orderService");
        orderService.doSth();
        System.out.println(app.getBean("userService"));

        System.out.println(app.getBean("testFactoryBean"));//取FactoryBean的getObject
        System.out.println(app.getBean("&testFactoryBean"));//取FactoryBean本身

        System.out.println("-------------");
        UserMapper userMapper = (UserMapper) app.getBean("userMapper");
        userMapper.getUser(1);
        System.out.println("-------------");

        String[]bdNames = app.getBeanDefinitionNames();
        for (String  name:bdNames) {
            System.out.println(name);
        }
    }

    //@Bean 先使用value作为beanName，没有value再使用方法名作为beanName
    @Bean
    public static MsgService getMsgService(){
        return new MsgService();
    }

    @Bean("msgService")
    public MsgService getMsgService1(){
        return new MsgService();
    }
}


